package com.youka.bussiness.common.utils;

import com.google.gson.Gson;
import com.qiniu.common.QiniuException;
import com.qiniu.common.Zone;
import com.qiniu.http.Response;
import com.qiniu.storage.BucketManager;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.util.Auth;
import com.youka.bussiness.common.base.BaseException;

import java.io.*;

/*********************************
 * 文件名称: SystemParamService.java
 * 功能说明: 七牛文件上传
 * 开发人员：huangchenglong
 * 开发时间：2018/4/13 17:38
 *********************************/
public class FileUtil {

    private final static String accessKey = "In5HVDDl5ZTsJ9f8TBvdbdy3wNGe6GK9xMtQ9j8W";
    private final static String secretKey = "Jkdt1kvsc3jkhTBFAax88z1pkYyKs73NRNtrL8EX";
    private final static String bucket_com = "zjxzx"; // 公共空间
    //    private final static String bucket_com_url = "http://zjqny.pfkweb.com/key"; // 公共空间访问路径
    private final static String bucket_com_url = "http://image.zukahome.com/key"; // 公共空间访问路径

    /**
     * 获取上传对象
     *
     * @return
     */
    private static UploadManager getUploadManager() {
        //构造一个带指定Zone对象的配置类
        Configuration cfg = new Configuration(Zone.zone0());
        //...其他参数参考类注释
        return new UploadManager(cfg);
    }

    /**
     * 获取认证
     *
     * @return
     */
    private static Auth getAuth() {
        return Auth.create(accessKey, secretKey);
    }

    public static void main(String[] args) {
        System.out.println(getUpToken());
    }

    /**
     * 获取token
     *
     * @return
     */
    public static String getUpToken() {
        Auth auth = getAuth();
        return auth.uploadToken(bucket_com);
    }

    /**
     * 以Base64的形式上传图片
     *
     * @param base64Img base64图片
     * @return
     */
    public static String byBase64(String base64Img) {
        return byBase64(base64Img, null);
    }

    /**
     * 以Base64的形式上传图片
     *
     * @param base64Img base64图片
     * @param key       需要保持唯一性.默认不指定key的情况下,以文件内容的hash值作为文件名.如果key为空则key==hash
     * @return
     */
    public static String byBase64(String base64Img, String key) {
        // 上传助手
        UploadManager uploadManager = getUploadManager();
        DefaultPutRet putRet = null;
        try {
            byte[] uploadBytes = base64Img.getBytes("UTF-8");
            String upToken = getUpToken();
            Response response = uploadManager.put(uploadBytes, key, upToken);
            //解析上传成功的结果
            putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
        } catch (QiniuException e) {
            throw new BaseException("101", "文件上传失败");
        } catch (UnsupportedEncodingException e) {
            throw new BaseException("101", "不支持的编码格式");
        }
        // 创建返回值
        String URL = "";
        URL = bucket_com_url.replace("key", putRet.key);
        return URL;
    }

    /**
     * 以文件的形式上传
     *
     * @param file 文件
     * @return
     */
    public static String byFile(File file) {
        return byFile(file, null);
    }

    /**
     * 以文件的形式上传
     *
     * @param file 文件
     * @param key  需要保持唯一性.默认不指定key的情况下,以文件内容的hash值作为文件名.如果key为空则key==hash
     * @return
     */
    public static String byFile(File file, String key) {
        InputStream is = null;
        try {
            is = new FileInputStream(file);
        } catch (FileNotFoundException e) {
            throw new BaseException("101", "文件未找到");
        }
        return byInputStream(is, key);
    }

    /**
     * 以流的形式上传图片
     *
     * @param is 数据流
     * @return
     */
    public static String byInputStream(InputStream is) {
        return byInputStream(is, null);
    }

    /**
     * 以流的形式上传图片
     *
     * @param is  数据流
     * @param key 需要保持唯一性.默认不指定key的情况下,以文件内容的hash值作为文件名.如果key为空则key==hash
     * @return
     */
    public static String byInputStream(InputStream is, String key) {
        // 上传助手
        UploadManager uploadManager = getUploadManager();
        // 获取token
        String upToken = getUpToken();
        DefaultPutRet putRet = null;
        try {
            Response response = uploadManager.put(is, key, upToken, null, null);
            //解析上传成功的结果
            putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
        } catch (QiniuException e) {
            throw new BaseException("101", "文件上传失败");
        }
        // 创建返回值
        String URL = "";
        URL = bucket_com_url.replace("key", putRet.key);
        return URL;
    }

    /**
     * 获取私有空间的下载链接
     *
     * @param expireSeconds 链接过期时间,单位:s(秒)
     * @return
     */
    public static String getPrivateURL(String URL, long expireSeconds) {
        //构造私有空间的需要生成的下载的链接
        String privateURL = getAuth().privateDownloadUrl(URL, expireSeconds);
        return privateURL;
    }

    /**
     * 删除文件
     *
     * @param fileName
     */
    public static void delete(String fileName) {
        try {
            BucketManager bucketManager = new BucketManager(getAuth(), new Configuration(Zone.zone0()));
            bucketManager.delete(bucket_com, fileName);
        } catch (Exception e) {
            //删除文件发生异常则忽略
        }
    }
}